ในบทเรียนก่อนหน้า เราได้เน้นไปที่ การดำเนินการแบบองค์ประกอบเดียว (เช่น ฟังก์ชัน ReLU พื้นฐานบนเมทริกซ์) การดำเนินการเหล่านี้เป็น ขึ้นอยู่กับหน่วยความจำ เพราะว่าจีพียูใช้เวลานานในการถ่ายโอนข้อมูลจากหน่วยความจำไฮเปอร์ (HBM) ไปยังเรจิสเตอร์ มากกว่าการดำเนินการทางคณิตศาสตร์
1. ทำไม GEMM จึงสำคัญ
การคูณเมทริกซ์ทั่วไป (GEMM) มีความซับซ้อนด้านการคำนวณเป็น $O(N^3)$ แต่ต้องการการเข้าถึงหน่วยความจำเพียง $O(N^2)$ เท่านั้น ทำให้เราสามารถซ่อนเวลาหน่วงการเข้าถึงหน่วยความจำไว้เบื้องหลังอัตราการประมวลผลทางคณิตศาสตร์ที่สูงมาก จึงกลายเป็น 'หัวใจ' ของโมเดลภาษาขนาดใหญ่ (LLMs)
2. การแสดงหน่วยความจำแบบสองมิติ
หน่วยความจำฟิสิกส์เป็นแบบหนึ่งมิติ เพื่อแสดงเทนเซอร์สองมิติ เราจึงใช้ สตรายด์. ปัญหาที่พบบ่อยในงานผลิตคือ การสมมุติว่าเทนเซอร์เป็นต่อเนื่อง. หากคุณสับสนระหว่างสตรายด์แถวและสตรายด์คอลัมน์ในการคำนวณพอยน์เตอร์ คุณจะเข้าถึงข้อมูล 'ลับ' หรือกระตุ้นให้เกิดข้อผิดพลาดด้านหน่วยความจำ
3. การขยายแนวคิดแบบแบ่งเป็นช่อง
Triton ขยายตรรกะการดำเนินการแบบองค์ประกอบเดียว โดยเปลี่ยนจากการใช้ พอยน์เตอร์เดี่ยว ไปเป็น กลุ่มพอยน์เตอร์. โดยการใช้ช่องแบบสองมิติ (เช่น $16 \times 16$) เราจะใช้ประโยชน์จาก การนำข้อมูลมาใช้ซ้ำ ในหน่วยความจำ SRAM ความเร็วสูง ทำให้ข้อมูลยังคง 'ร้อน' สำหรับการทำงานรวม เช่น การเพิ่มเบียส หรือการกระตุ้น (activation) ก่อนเขียนกลับไปยังหน่วยความจำหลัก (Global Memory)